package com.dujiu.leetcode.slidingWindow.fixed_lengthSlidingWindow;

/*
可获得的最大点数:
    拿走 k 张，剩下 n−k 张。这里 n 是 cardPoints 的长度。
    由于拿走的点数和 + 剩下的点数和 = 所有点数和 = 常数，所以为了最大化拿走的点数和，应当最小化剩下的点数和。
 */
public class P1423 {
    /*
可获得的最大点数:
    拿走 k 张，剩下 n−k 张。这里 n 是 cardPoints 的长度。
    由于拿走的点数和 + 剩下的点数和 = 所有点数和 = 常数，所以为了最大化拿走的点数和，应当最小化剩下的点数和。
 */
    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length;
        int m = n - k;
        int sum = 0;
        for (int i = 0; i < m; i++) {
            sum += cardPoints[i];
        }
        int total = sum;
        int minSum = sum;
        for (int i = m; i < n; i++) {
            total += cardPoints[i];
            // 删除前面的，更新sum的值，找到其最小值
            sum += cardPoints[i] - cardPoints[i-m];
            minSum = Math.min(sum,minSum);
        }
        return total - minSum;
    }

    /**
     * 从正面求出最大值
     * @param cardPoints
     * @param k
     * @return
     */
    public int maxScore2(int[] cardPoints, int k) {
        int n = cardPoints.length;
        int sum = 0;
        for (int i = 0; i < k; i++) {
            sum += cardPoints[i];
        }
        int maxSum = sum;
        for (int i = 1; i <= k ; i++) {
            sum += cardPoints[n-i] - cardPoints[k-i];
            maxSum = Math.max(sum,maxSum);
        }
        return maxSum;
    }
}
